package ar.edu.utn.frba.gdaia.src.util;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

import ar.edu.utn.frba.gdaia.src.domain.ConceptoElemental;
import ar.edu.utn.frba.gdaia.src.domain.Situacion;

/**
 * 
 * @author Patricio
 *
 */
public class TreeUtil {
	
	/**
	 * Retorna todas las hojas a partir de un nodo DefaultMutableTreeNode
	 * @param tree
	 * @return todas las hojas
	 */
	public static List<DefaultMutableTreeNode> obtenerTodasLasHojas(DefaultMutableTreeNode tree) {
		List<DefaultMutableTreeNode> hojas = new ArrayList<DefaultMutableTreeNode>();
		
		Enumeration allNodos = tree.depthFirstEnumeration();
		for(Enumeration<DefaultMutableTreeNode> e = allNodos; e.hasMoreElements();){
			DefaultMutableTreeNode nodo = e.nextElement();
			if(nodo.isLeaf())
				hojas.add(nodo);			
		}
		return hojas;
	}
	
	
	/**
	 * Inserto los abstractos, como nodos en las hojas, formando nuevas hojas.
	 * Por cada concepto abstacto vos a crear N nodos, tantos como hojas haya, ya que
	 * cada nodo puede tener un solo padre. 
	 * @param tree DefaultMutableTreeNode
	 * @param abs Lista de conceptos elementales
	 */
	public static void insertarPorLasHojas(DefaultMutableTreeNode tree, Set abs) {
		List<DefaultMutableTreeNode> hojas = TreeUtil.obtenerTodasLasHojas(tree);
		DefaultMutableTreeNode nuevaHoja = null;
	
		//inserto por las hojas
		for (Iterator<DefaultMutableTreeNode> it = hojas.iterator(); it.hasNext();) {
			DefaultMutableTreeNode hoja = it.next();			
			
			// itero los nuevos nodos y los inserto en cada hoja, formando una nueva hoja
			for (Iterator it2 = abs.iterator(); it2.hasNext();) {
				ConceptoElemental conceptoAFormarHoja = (ConceptoElemental) it2.next();
				nuevaHoja = new DefaultMutableTreeNode(conceptoAFormarHoja);
				hoja.add(nuevaHoja);
			}			
		}		
	}

	/**
	 * Retorna una lista con los elementos de los nodos del path en el mismo orden
	 * @param path Lista de elementos-nodos en un arbol
	 * @return Lista de elementos Object del path de tree nodos
	 */
	public static List getListOfElements(TreeNode[] path) {
		List elements = new ArrayList();
		for (int i = 0; i < path.length; i++) {
			DefaultMutableTreeNode node = (DefaultMutableTreeNode)path[i];
			elements.add(node.getUserObject());
		}
		return elements;
	}

}
